// 子模块moduleA路径：store/modules/moduleA.js 
export default {
    // 命名空间
    namespaced: true,
	state: {
		// list:[
        //      //  { 商品id ，商品图片，商品价格，商品名称，商品数量=1，选中状态 },
        //     // {  商品id ，商品图片，商品价格，商品名称，商品数量，选中状态 },
        //     // {  商品id ，商品图片，商品价格，商品名称，商品数量=2，选中状态 },
        // ]

        // 如果本地存储有值 就读取本地的值  如果本地没有存有值 就读取空数组
        list: uni.getStorageSync('hmyg-cart') || []
	},
	getters: {
		 // 计算出全部商品的购买数量
         totalNums(state) {
            // 数组方法 reduce
            // 数组forEach
            let nums = 0;
            state.list.forEach((v) => (nums += v.num));
            return nums;
      
            // return state.list.reduce((s, v) => s + v.num, 0);
          },
        //   勾选了商品的数组
        checkedCarts(state){
            return state.list.filter((v) => v.checked)
        },
        // 勾选了商品的总价
        checkedCartPrice(state,getters){
            return getters.checkedCarts.reduce(
                // 单价 * 数量
                (s,v) => s + v.num * v.goods_price,0
            )
        },
        // 勾选了商品的总数量
        checkedCartNums(state,getters){
            // 在一个 getters里面引入另外一个getters
            return getters.checkedCarts.reduce((s,v) => s + v.num,0)//0 从0开始算
        },
        // 计算 要不要全选
        allCheck(state,getters){
            // 判断 购物车数组的长度 和 选中的商品的数组长度 是否相等
            // 相等 全选  不相等 不全选
            // 要排斥掉都是0 （就算没有商品了全选按钮也会选中）
            return state.list.length && (state.list.length === getters.checkedCarts.length)//存在商品 并且长度相等
        }
	},
	mutations: {
		// 添加商品
        addCart(state,payload){
            // payload = 传过来的数据 goodsDetail
            // 判断商品是否存在 findIndex找到就返回数组下标 找不到就返回-1
            // v list数组中的 每一个对象
            const index = state.list.findIndex((v)=>v.goods_id === payload.goods_id)
            if(index === -1){
                // 没有添加购物车
                // 新增商品  数量变1 为选中状态
                state.list.push({...payload, num:1, checked:true});
            }else{
                // 已经存在购物车
                // 将存在的商品数量+1
                state.list[index].num++
            }

            // 防止页面刷新数据丢失  所以要把添加后的商品存到 本地存储中
            // uni.setStorageSync('名称',值)
            uni.setStorageSync('hmyg-cart',state.list)
        },
        // 商品选中切换
        toggleGoodsCheck(state,payload){
            // payload = index
            // 将按钮的选中状态取反
            state.list[payload].checked = !state.list[payload].checked
            // console.log(state.list);

            // 再重新保存到 本地存储中
            uni.setStorageSync('hmyg-cart',state.list)
        },
        // 全选按钮 控制 商品的选中状态
        toggleAllCheck(state,payload){
            // 点击全选将复选框取反
            const allCheck = !this.getters['cart/allCheck']
            // 所有的商品的复选框与全选的复选框状态一致
            state.list.forEach((v)=>(v.checked = allCheck))
            // 再重新保存到 本地存储中
            uni.setStorageSync('hmyg-cart',state.list)
        },
        // 商品数量的改变
        numChange(state,payload){
            // 根据传的参数 的下标来进行 数量的加减
            // payload 传过来的对象参数
            state.list[payload.index].num += payload.num
            // 再重新保存到 本地存储中
            uni.setStorageSync('hmyg-cart',state.list)
        },
        // 当商品的数量减到0时，需要删除商品数组中的这个商品
        deleteGoods(state,payload){
            state.list.splice(payload,1)
            // 再重新保存到 本地存储中
            uni.setStorageSync('hmyg-cart',state.list)
        }

	},
	actions: { 
		
	}
}
